home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
007
/
jovept2.arc
/
MARKS.C
< prev
next >
Wrap
Text File
|
1985-05-30
|
4KB
|
217 lines
/* marks.c */
/* JOVE/MSDOS. K. Mitchum 1/85 */
/* Modifications for personal use only. */
/* original code J. Payne LSRHS 5/83 */
/* Ken Mitchum */
/* University of Pittsburgh */
/* Decision Systems Laboratory */
/*
Jonathan Payne at Lincoln-Sudbury Regional High School 5-25-83
jove_marks.c
Creation of marks, and routines to adjust the marks after insertion
or deletion. */
#include "jove.h"
MARK *
DoMakeMark(buf, line, column)
BUFFER *buf;
register LINE *line;
{
MARK *newmark;
newmark = (MARK *) emalloc(sizeof (struct mark));
MarkSet(newmark, line, column);
newmark->m_next = buf->b_marks;
buf->b_marks = newmark;
return newmark;
}
MARK *
MakeMark(line, col)
LINE *line;
{
return DoMakeMark(curbuf, line, col);
}
DelMark(m)
MARK *m;
{
DoDelMark(curbuf, m);
}
DoDelMark(b, m)
BUFFER *b;
register MARK *m;
{
register MARK *mp = b->b_marks;
if (m == mp)
b->b_marks = m->m_next;
else {
while (mp != 0 && mp->m_next != m)
mp = mp->m_next;
if (mp == 0)
complain("Trying to delete unknown mark!");
mp->m_next = m->m_next;
}
free((char *) m);
}
AllMarkSet(b, line, col)
BUFFER *b;
register LINE *line;
{
register MARK *mp;
for (mp = b->b_marks; mp; mp = mp->m_next)
MarkSet(mp, line, col);
}
MarkSet(m, line, column)
MARK *m;
LINE *line;
{
m->m_line = line;
m->m_char = column;
}
PopMark()
{
int pmark;
if (curmark == 0)
return;
if (curbuf->b_markring[(curbuf->b_themark + 1) % NMARKS] == 0) {
pmark = curbuf->b_themark;
do {
if (--pmark < 0)
pmark = NMARKS - 1;
} while (curbuf->b_markring[pmark] != 0);
curbuf->b_markring[pmark] = MakeMark(curline, curchar);
ToMark(curmark);
DelMark(curmark);
curmark = 0;
} else
PtToMark();
pmark = curbuf->b_themark - 1;
if (pmark < 0)
pmark = NMARKS - 1;
curbuf->b_themark = pmark;
}
SetMark()
{
if (exp_p)
PopMark();
else {
curbuf->b_themark = (curbuf->b_themark + 1) % NMARKS;
if (curmark == 0)
curmark = MakeMark(curline, curchar);
else
MarkSet(curmark, curline, curchar);
s_mess("Point pushed");
}
}
/* Move point to mark */
ToMark(m)
MARK *m;
{
if (m == 0)
return;
DotTo(m->m_line, m->m_char);
}
MARK *
CurMark()
{
if (curmark == 0)
complain("No mark");
return curmark;
}
PtToMark()
{
LINE *mline;
int mchar;
MARK *m = CurMark();
mline = curline;
mchar = curchar;
ToMark(m);
MarkSet(m, mline, mchar);
}
/* Fix marks for after a deletion */
DFixMarks(line1, char1, line2, char2)
register LINE *line1,
*line2;
{
register MARK *m;
LINE *lp = line1;
if (curbuf->b_marks == 0)
return;
while (lp != line2->l_next) {
for (m = curbuf->b_marks; m; m = m->m_next)
if (m->m_line == lp)
m->m_char |= (1 << 15);
lp = lp->l_next;
}
for (m = curbuf->b_marks; m; m = m->m_next) {
if ((m->m_char & (1 << 15)) == 0)
continue; /* Not effected */
m->m_char &= ~(1 << 15);
if (m->m_line == line1 && m->m_char < char1)
continue; /* This mark is not affected */
if (line1 == line2) {
if (m->m_char >= char1 && m->m_char <= char2)
m->m_char = char1;
else if (m->m_char > char2)
m->m_char -= (char2 - char1);
/* Same line move the mark backward */
} else if (m->m_line == line2) {
if (m->m_char > char2)
m->m_char = char1 + (m->m_char - char2);
else
m->m_char = char1;
m->m_line = line1;
} else {
m->m_char = char1;
m->m_line = line1;
}
}
}
IFixMarks(line1, char1, line2, char2)
register LINE *line1,
*line2;
{
register MARK *m;
for (m = curbuf->b_marks; m; m = m->m_next) {
if (m->m_line == line1) {
if (m->m_char > char1) {
m->m_line = line2;
if (line1 == line2)
m->m_char += (char2 - char1);
else
m->m_char = char2 + (m->m_char - char1);
}
}
}
}
/* end */